Software packages can be obtained to perform many day-to-day tasks. For example, banking, tax preparation, bill paying, grocery shopping, and financial planning are just some of the many activities that can be performed with the aid of software programs.
Many of the commodity software packages that are commercially available today are intended to be loaded onto a user's computer system and executed “as is”. In other words, the software licensor and/or vendor are not in the business of customizing the software for a particular customer. In the large majority of cases involving such software packages, this type of customization is not necessary, since the “off-the-shelf” functionality will satisfy the needs of most users. Moreover, customization of this type of commodity product would not be economically viable, and would present daunting support issues.
The foregoing is not true in instances involving large, complex software systems of the type that may control banking or transportation applications, however. For example, consider a cargo management system employed to schedule the transport of cargo on airplane flights. Such a system must generally take into consideration particularities associated with a particular user such as an airline carrier. For instance, it may be necessary or even mandatory that the system conforms to the airline's safety and business requirements. The system may also be required to reflect the type of equipment and aircraft that will be used to transport the cargo. It may also be desirable to make the system conform to the “look and feel” of the other tools used by the specific airlines so that the system is more user-friendly to employees.
Large complex systems of the type discussed above are not generally considered commodity products. They are developed for a small, specialized group of customers that are willing to finance the customization activities. If this is the case, the software developer may create a specialized version of the software that includes functionality that is needed by a specific customer and is only provided to that customer. Another version may be developed for another client, and so on.
If multiple versions of a particular software product are developed in the foregoing manner, support issues become problematic. When a common function is added to the system, each of the versions must be updated separately to incorporate the new code. A similar problem exists when a coding error is discovered in one of the common functions. The problem must be fixed by updating each of the software versions independently. Additionally, revision control becomes more complicated, since code levels must be tracked for each code version.
One way to solve the foregoing problem is to maintain the functionality for all customers within a single integrated version of the code. User-specific functionality is selected using conditional logic. For example, a variable is assigned a value that corresponds to customer identification. When a function containing user-specific code is called, the variable is tested to determine how the function should be completed. In this manner, only a single version of the code must be supported. Additionally, revision control is simplified.
While the foregoing mechanism may make code support more efficient, it results in a software application that may be much larger than if the conditional logic and user-specific functionality were not included. Since all functionality is integrated into a single package, the amount of memory required to load and execute the software will increase. This increase may become prohibitive. Additionally, when an update is entered for one customer, the entire software package may have to be recompiled. This can be very time consuming.
In addition to the above-described challenges, more of today's software applications are adapted to be accessed via the Internet or worldwide web. In this type of environment, user requests are generally issued by a client system to a server. In response to such a request, a server may initiate some type of data processing activity or perform a database query, then return requested data to the client system. This type of scenario is very common in many of today's e-commerce applications, for example. A flexible mechanism is needed to support multiple versions of a software application that is adapted for use in this type of a web-based environment.
What is needed, therefore, is an improved system and method for addressing the foregoing problems and challenges.